package org.springblade.modules.admin.service.parts;

import org.springblade.core.log.exception.ServiceException;
import org.springblade.modules.admin.enums.TaskStatusEnum;

import java.util.HashMap;
import java.util.Map;

/**
 * @Description 配件工单状态机
 * @Author ysq
 * @Date 2024/05/16
 **/
public class PartsStateMachine {
	private static final Map<TaskStatusEnum, TaskStatusEnum> PARTS_STATE_MAP = new HashMap<>();

	// 初始化状态机,只接受指定的当前状态下，可以到达的指定目标状态
	static {
		// 待审批 -> 待报价
		PARTS_STATE_MAP.put(TaskStatusEnum.PARTS_APPROVE, TaskStatusEnum.PARTS_OFFER);
		// 待报价 -> 待回签
		PARTS_STATE_MAP.put(TaskStatusEnum.PARTS_OFFER, TaskStatusEnum.PARTS_REPLY);
		// 待回签 -> 待采购
		PARTS_STATE_MAP.put(TaskStatusEnum.PARTS_REPLY, TaskStatusEnum.PARTS_PROCUREMENT);
		// 待采购 -> 待发货
		PARTS_STATE_MAP.put(TaskStatusEnum.PARTS_PROCUREMENT, TaskStatusEnum.PARTS_SHIPMENTS);
		// 待发货 -> 待收货
		PARTS_STATE_MAP.put(TaskStatusEnum.PARTS_SHIPMENTS, TaskStatusEnum.PARTS_RECEIVE);
		// 待收货 -> 待分配
		PARTS_STATE_MAP.put(TaskStatusEnum.PARTS_RECEIVE, TaskStatusEnum.PARTS_ALLOCATION);
	}

	/**
	 * 根据事件推进状态
	 * @param currentStatus 当前状态
	 * @param targetStatus 目标状态
	 * @return 状态码
	 */
	public static int transferStatus(TaskStatusEnum currentStatus, TaskStatusEnum targetStatus) {
		if (PARTS_STATE_MAP.containsKey(currentStatus) && PARTS_STATE_MAP.get(currentStatus).equals(targetStatus)) {
            return PARTS_STATE_MAP.get(currentStatus).getStatus();
        } else {
            throw new ServiceException("状态异常: 当前状态不可到达目标状态");
        }
	}

}
